Google Cloud上でGoogleの次世代のASR(自動音声認識)モデル「Chirp」を使ってみた
こんちには。
データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。
この記事は、ブログリレー『Google CloudのAI/MLとかなんとか』の3本目の記事になります。
今回は、Vertex AIからGoogleの次世代のASR(自動音声認識)モデル「Chirp」を使ってみたいと思います。
Chirpについて
以下に詳しい説明があります。
ChirpはGoogleの次世代音声認識モデルで、現在の音声モデルとは異なるアーキテクチャで学習させたモデルとなっているようです。 Google CloudではCloud Speech-to-Text V2における一つのモデルとして使用できます。その他、Vertex AIの画面の「GENERATIVE AI STUDIO」から呼び出すこともできます。
詳しい処理はGoogle USMの論文に記載があるようです。
ドキュメントによればStreaming用のAPIには対応していないため、ファイルごとのアップロードになるようです。
Chirp is not available on the following API methods:
・v2 Speech.StreamingRecognize
・v1 Speech.StreamingRecognize
・v1 Speech.Recognize
・v1 Speech.LongRunningRecognize
・v1p1beta1 Speech.StreamingRecognize
・v1p1beta1 Speech.Recognize
・v1p1beta1 Speech.LongRunningRecognize
リージョンは以下に対応しています。
- us-central1
- europe-west4
- asia-southeast1
言語は多くのものに対応しており、日本語にももちろん対応しています。
Pricing
Pricingについては以下のページに記載があります。
こちらによると、ChirpはV2のStandardに含まれるようですので、$0.016 / minute
となっているようです。
コンソールから使ってみた
以降、このChirpを使ってみていきたいと思います。
まずはコンソールから使ってみます。
Cloud Speech-to-TextのAPI有効化
まずは左の一覧から「Speech」を選択します。(見えない場合は、その他のプロダクトで全メニューを開く必要があります)
以下のようにAPIが有効になっていなければ、有効とします。
Vertex AIからGENERATIVE AI STUDIOにアクセス
最初の画面に戻り、左の一覧から「Vertex AI」を選択します。(見えない場合は、その他のプロダクトで全メニューを開く必要があります)
Vertex AIのメニューから「GENERATIVE AI STUDIO」の「音声」を選択します。
Chirpを動かしてみる
タブで「音声文字変換」を選ぶことで使用可能です。右端で言語をJapaneseに設定して音声データを選択します。
最後に、右端メニューの送信を押すと処理が実行されます。結果はテキスト欄に表示されます。
サンプル音声は私の社内勉強会の音声です。冒頭なのでかなり口語調のデータなのですが、それでも正確に認識されました。
お聞き苦しいデータかもしれませんが、その正確性に驚きましたのでそのままアップさせて頂きます。データは以下となります。
「音声を記録します」のメニューを使うと、PCのマイクからの音声を録音して認識が可能です。ただし一度録音を止めてから送信する必要がありますので、リアルタイムでテキストへ変換できないので、その点はご注意ください。
また右端メニューの「SPEECH STUDIOを試す」をクリックすると、Speech-to-Textサービスに遷移し、その他の機能を利用することが可能なようです。こちらは今回扱いませんが、今後機会があれば取り上げたいと思います。
ローカルマシンから使ってみた
次にローカルマシンからPythonコードで使ってみたいと思います。
サービスアカウント作成と認証情報の取得
「IAMと管理」から「サービスアカウント」を選択します。
「サービス アカウントを作成」をクリックします。
以下のように入力して、「作成して続行」を押下します。
ロールは「Cloud Speech 管理者」として「続行」を押下します。
以下は特になにも入力せずに「完了」を押下します。
作成したサービスアカウントをクリックします。
「キー」というタブをクリックします。
「鍵を追加」を押下し、「新しい鍵を作成」を押下します。
「JSON」を選択肢て、「作成」を押下します。
「作成」を押下すると、同時に認証情報が記載されたjsonファイルがダウンロードされます。
Python環境の構築
つづいて、ローカルで必要なPython環境を構築していきます。
まずPythonのバージョンは3.10.13で実行しました。
またパッケージは、お使いのPython環境に合わせてpipなどでインストールしてください。
私はpoetryを使って入れました。
poetry add google-cloud-speech
以下のバージョンのパッケージが入りました。
google-cloud-speech==2.22.0
Pythonコードの実行
以下のリンクにあるtranscribe_chirp.py
というコードを元にコードを実行します。
認証情報が格納されたjsonファイルを、GOOGLE_APPLICATION_CREDENTIALS
という環境変数に設定します。
import os credentials_json_path = "{認証情報が格納されたjsonファイル}" os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = credentials_json_path
その後、以下のように実行すれば、結果を得ることができました。
from google.cloud.speech_v2 import SpeechClient from google.cloud.speech_v2.types import cloud_speech from google.api_core.client_options import ClientOptions # プロジェクトIDは書き換えてお使いください project_id = "{プロジェクトID}" location = "us-central1" # エンドポイントのロケーション設定が必要 client = SpeechClient( client_options=ClientOptions( api_endpoint=f"{location}-speech.googleapis.com", ) ) # ここの音声ファイルは書き換えてお使いください with open("sample.wav", "rb") as f: content = f.read() # Chirpモデルをここで指定 config = cloud_speech.RecognitionConfig( auto_decoding_config=cloud_speech.AutoDetectDecodingConfig(), language_codes=["ja-JP"], # autoでも可 model="chirp", ) # Recognizerもエンドポイントと同じロケーションが必要 request = cloud_speech.RecognizeRequest( recognizer=f"projects/{project_id}/locations/{location}/recognizers/_", config=config, content=content, ) # Transcribes the audio into text response = client.recognize(request=request) for result in response.results: print(f"Transcript: {result.alternatives[0].transcript}")
Transcript: 画面 共有 よいしょ 画面 見え て ます でしょう か こっち か はい
注意点
上記でOKなのですが、何点か使用するにあたって注意点があったのでご紹介します。
V1とV2の違い
はじめはコンソール上のGENERATIVE AI STUDIOの画面からダウンロードできるコードを使用しており、このコードがV1を使うものとなっていましたので意図しない動作となりました。
このコードは以下のようなコードです。
参考までに、ダウンロードされたコードに基づく記述は以下です。
from google.cloud import speech # プロジェクトIDは書き換えてお使いください project_id = "{プロジェクトID}" # Instantiates a client client = speech.SpeechClient() # ここの音声ファイルは書き換えてお使いください with open("sample.wav", "rb") as f: data = f.read() audio_content = data # transcribe speech audio = speech.RecognitionAudio(content=audio_content) config = speech.RecognitionConfig( encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16, sample_rate_hertz=48000, # ここはwavファイルに合わせて変更ください language_code="ja-JP", model="default", audio_channel_count=1, enable_word_confidence=True, enable_word_time_offsets=True, ) # Detects speech in the audio file operation = client.long_running_recognize(config=config, audio=audio) print("Waiting for operation to complete...") response = operation.result(timeout=90) for result in response.results: print("Transcript: {}".format(result.alternatives[0].transcript))
Waiting for operation to complete... Transcript: ごめん今日 Transcript: ごめん見えてますでしょうか
V1で使用可能なモデルは以下です。
V2のChirp以外との違い
次にV2のコードを探し求めて、最初はV2のサンプルコードとして以下を使っておりました。
こちらはmodel="long"
となっておりChirpを使わないものになっているため注意が必要です。また、Chirpはglobalのrecoginizerを使えない点も違いとしてありました。
参考までにこちらに沿ったコードも貼っておきます。
# プロジェクトIDは書き換えてお使いください project_id = "{プロジェクトID}" # Instantiates a client client = SpeechClient() # ここの音声ファイルは書き換えてお使いください with open("sample.wav", "rb") as f: content = f.read() config = cloud_speech.RecognitionConfig( auto_decoding_config=cloud_speech.AutoDetectDecodingConfig(), language_codes=["ja-JP"], model="long", # ここがlongとなっている ) request = cloud_speech.RecognizeRequest( recognizer=f"projects/{project_id}/locations/global/recognizers/_", # recognizerがglobal config=config, content=content, ) # Transcribes the audio into text response = client.recognize(request=request) # print(response.results[0].alternatives) for result in response.results: if len(result.alternatives) == 0: continue print(f"Transcript: {result.alternatives[0].transcript}")
Transcript: ちょっとごめん 共有 Transcript: よいしょ Transcript: ごめん 見えてますでしょうか Transcript: こっちか
参考までにV2で使用可能なモデルは以下です。Chirp以外にもいくつかのモデルがあるようです。
まとめ
いかがでしたでしょうか。
今回はGoogle Cloud環境からGoogleの次世代のASR(自動音声認識)モデル「Chirp」を使ってみました。
本記事が活用の参考になれば幸いです。